4208. Степени двойки

 

Ни для кого не секрет, что число 2n при любом целом неотрицательном n в двоичной системе счисления имеет очень простой вид – в старшем разряде стоит единица, а затем следует n нулей. В десятичной системе счисления эти числа не столь однообразны, однако и среди них встречаются те, которые начинаются с единицы.

Вычислите, сколько таких чисел в заданном диапазоне.

 

Вход. Два целых числа n1 и n2 (0 ≤ n1 < n2 ≤ 109), разделенные пробелом.

 

Выход. Вывести количество чисел, являющихся степенями двойки и принадлежащих отрезку [2n1; 2n2], у которых в десятичной системе счисления в старшем разряде стоит единица.

 

Пример входа

0 10

 

Пример выхода

4

 

 

РЕШЕНИЕ

математика – логарифмы

 

Анализ алгоритма

Среди всех n-значных чисел от 10n-1 до 10n – 1 всегда существует одно и только одно число, начинающееся с единицы и являющееся степенью двойки. Например, среди двузначных таким будет число 16, среди трехзначных 128, четырехзначных 1024 и так далее. Отсюда можно заключить, что количество чисел на интервале [1 .. 2k], являющихся степенью двойки и начинающихся с единицы, равно количеству цифр в десятичном представлении числа 2k. Обозначим его через f(k). Тогда количество искомых чисел на интервале [2n1; 2n2] равно f(n2) – f(n1 – 1).

Количество цифр в десятичном представлении числа n равно . Число 2k состоит из  цифр.

 

Реализация алгоритма

Читаем входные данные. Вычисляем и выводим ответ. Воспользуемся равенством  =  чтобы формула работала корректно и для случая n1 = 0.

 

scanf("%d %d",&n1,&n2); n1--;

d1 = (int)(n1*log10(2.0) + 1);

d2 = (int)(n2*log10(2.0) + 1);

printf("%d\n",d2 - d1);